﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using DevComponents.DotNetBar;
using Platform.Model;
using BLToolkit.Data.Linq;
using System.Linq;
using Platform.Model;
using BLToolkit.Data;
using System.Data.SqlClient;

namespace PlatformManagement
{
    public partial class PickingForm : DevComponents.DotNetBar.Metro.MetroForm
    {
        public PickingForm()
        {
            InitializeComponent();
            dgvArt.AutoGenerateColumns = false;
            dgvSup.AutoGenerateColumns = false;
           dgvPickingListDetail.AutoGenerateColumns = false;
           dgvPickingList.AutoGenerateColumns = false;
        }
        protected override void OnActivated(EventArgs e)
        {
            base.OnActivated(e);
            this.WindowState = FormWindowState.Maximized;
        }
      
      //Tạo biến lưu mã nhà cung cấp
        private int supid=0;
        //Tạo biến lưu mã hàng hóa
        private string artid = "";
        //Tạo biến lưu mã picking
        private int pickingid = 0;
        private bool _curr=false;

        private void PickingForm_Load(object sender, EventArgs e)
        {
            Load_Art_Sup();
            DisplayName();
        }

        //Load danh sách mặt hàng và nhà cung ứng
        private  void Load_Art_Sup()
        {
            dgvArt.DataSource = Article.Objects.Where(x => x.MarketId == 1).ToList();
            dgvSup.DataSource = Supplier.Objects.Where(x => x.MarketId == 1).ToList();
        }

        /// <summary>
        /// Tìm kiếm hàng hóa
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void txtArt_TextChanged(object sender, EventArgs e)
        {
            dgvArt.DataSource = Article.Objects.Where(x => x.ArtName.IndexOf(txtArt.Text) != -1).ToList();
        }
        //Tìm kiếm nhà cung ứng
        private void txtSup_TextChanged(object sender, EventArgs e)
        {
            dgvSup.DataSource =
                Supplier.Objects.Where(
                    x => x.FirstName.IndexOf(txtSup.Text) != -1 || x.LastName.IndexOf(txtSup.Text) != -1).ToList();
        }

        //KHi chọn một nhà cung cấp thì tiến hành load tất cả các mặt hàng của người đó lên
        private void dgvSup_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            if(dgvSup.CurrentRow.Cells[0].Value !=null)
            {
                supid = Supplier.Objects.FirstOrDefault(x => x.SupNo == dgvSup.CurrentRow.Cells[0].Value.ToString()).ID;
                IDataParameter[] parameters = new IDataParameter[2];
                parameters[0] = new SqlParameter("@supno", dgvSup.CurrentRow.Cells[0].Value.ToString());
                parameters[1] = new SqlParameter("@marketid",1);
                dgvArt.DataSource = GetSproc("GetArticleBySup", parameters);
            }
        }

        //Lấy dữ liệu từ store procedure
        private DataTable GetSproc(string sprocname, IDataParameter[] parameters)
        {
            try
            {
                var db = new DbManager("DBConnection");
                return db.SetSpCommand(sprocname, parameters).ExecuteDataTable();
            }
            catch (Exception ex)
            {
                MessageBox.Show("Lỗi : \n" + ex.Message);
            }
            return null;
        }

        //Khi chọn một mặt hàng thì load danh sách tương ứng với mặt hàng đó lên
        private void dgvArt_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            if (dgvArt.CurrentRow.Cells[0].Value != null)
            {
                artid = dgvArt.CurrentRow.Cells[0].Value.ToString();
                IDataParameter[] parameters = new IDataParameter[3];
                parameters[0] = new SqlParameter("@artno", dgvArt.CurrentRow.Cells[0].Value.ToString());
                parameters[1] = new SqlParameter("@marketid", 1);
                parameters[2] = new SqlParameter("@supid", supid);
                dgvPickingList.DataSource = GetSproc("GetPickingListByArt", parameters);
            }
        }

        //Khi chọn một dòng trên danh sách cân hàng
        private void dgvPickingList_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            try
            {
                if (e.RowIndex != -1)//Dòng đang chọn không phải là tiêu đề
                {

                    var pick = dgvPickingList.Rows[e.RowIndex];
                    int n = 0;
                    if (pick.Cells[0].Value !=null && int.TryParse(pick.Cells[0].Value.ToString(), out n))
                    {
                        dgvPickingListDetail.Enabled = true;
                        int column = dgvPickingList.ColumnCount;
                        pickingid = int.Parse(pick.Cells[0].Value.ToString());
                        if (e.ColumnIndex == column - 1)
                        //Nếu nhấn vào nút cân hàng thì thực hiện cân hàng
                        {
                           
                            if (pick.Cells[dgvPickingList.ColumnCount - 1].Value.ToString() == "Pick")//Cân lần mới
                            {
                                PickingDetail _pickingDetail= new PickingDetail();
                                _pickingDetail.PickingId = int.Parse(pick.Cells[0].Value.ToString());
                                _pickingDetail.SupId = supid;
                                _pickingDetail.Gross =
                                    _pickingDetail.Net =
                                    _pickingDetail.Large =
                                    _pickingDetail.Medium =
                                    _pickingDetail.Small =
                                    _pickingDetail.Tiny = 0;
                                _pickingDetail.NLoss = _pickingDetail.PLoss = 0;
                                _pickingDetail.WeightedBy =WorkSession.Current.CurrentUser.ID;
                                _pickingDetail.LastUpdated = DateTime.Now;
                                _pickingDetail.Notes = "";
                                   
                                PickingDetail.Objects.Insert(_pickingDetail);
                                Load_Detail(int.Parse(pick.Cells[0].Value.ToString()));
                            }
                            else//Cân thêm khi hàng đang thiếu
                            {
                                Load_Detail(int.Parse(pick.Cells[0].Value.ToString()));
                            }
                        }
                       
                        
                    }
                    
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Lỗi \n" + ex.Message);
            }
           
        }

        //Load PickingDetail theo mã pickinglist
        private  void Load_Detail(int id)
        {
            dgvPickingListDetail.DataSource = new BindingSource
                                                  {
                                                      DataSource =
                                                          PickingDetail.Objects.Where(x => x.PickingId == id).ToList()
                                                  };
        }
      

        //Hiển thị tên thay mã
        private void DisplayName()
        {
            //Load tên hàng hóa
            clArtId.DataSource = Article.Objects.Where(x => x.MarketId == 1).ToList();
            clArtId.DisplayMember = "ArtName";
            clArtId.ValueMember = "ID";

            //Load tên kho
            clStoreId.DataSource = Store.Objects.All;
            clStoreId.DisplayMember = "StoreName";
            clStoreId.ValueMember = "Id";

            //Load tên nhà cung cấp
            clSupId.DataSource = Supplier.Objects.Where(x => x.MarketId == 1).ToList();
            clSupId.DisplayMember = "Name";
            clSupId.ValueMember = "ID";

            //Load tên người cân
            clWeightedBy.DataSource = Employee.Objects.ToList();
            clWeightedBy.DisplayMember = "FullName";
            clWeightedBy.ValueMember = "ID";
        }

       
        //Cập nhật lại chi tiết lần cân
        private void dgvPickingListDetail_RowValidated(object sender, DataGridViewCellEventArgs e)
        {
            try
            {
                if(_curr)
                {
                      var _pick = dgvPickingListDetail.Rows[e.RowIndex];
                    var Pick = _pick.DataBoundItem as PickingDetail;
                  

                    if (int.Parse(_pick.Cells[0].Value.ToString()) == 0)//Nếu cell đầu tiên là số 0 thì tiến hành thêm
                    {
                        PickingDetail.Objects.Insert(Pick);
                    }
                    else//Ngược lại tiến hành cập nhật
                    {
                        PickingDetail.Objects.Update(Pick);
                    }
                    float nloss = 0, ploss = 0, net = 0,gross=0;
                    int pack = 0;
                    var pickingdetail = PickingDetail.Objects.Where(x => x.PickingId == pickingid).ToList();
                    for (int i = 0; i < pickingdetail.Count; i++)
                    {
                        gross += pickingdetail[i].Gross;
                        net += pickingdetail[i].Net;
                        nloss += pickingdetail[i].NLoss;
                        ploss += pickingdetail[i].PLoss;
                        pack += (pickingdetail[i].Large + pickingdetail[i].Medium + pickingdetail[i].Small +
                                 pickingdetail[i].Tiny);
                    }
                    var p = PickingList.Objects.FirstOrDefault(x => x.ID == pickingid);
                    if (net-p.OrderQty >9)
                    {
                        MessageBox.Show("Khối lượng cân lớn hơn khối lượng đặt hàng, vui lòng kiểm tra lại");
                        if(_pick.Cells[0].Value.ToString()=="0")
                        {
                            PickingDetail.Objects.Delete(Pick);
                            Load_Detail(pickingid);
                        }
                      
                    }
                    else
                    {
                        if (p.OrderQty == net)
                            p.Status = true;
                        else
                            p.Status = true;
                        p.ID = p.ID;
                        p.ArtId = p.ArtId;
                        p.DoId = p.DoId;
                        p.OrderNo = p.OrderNo;
                        p.OrderQty = p.OrderQty;
                        p.StoreId = p.StoreId;
                        p.PLoss = ploss;
                        p.NLoss = nloss;
                        p.Net = net;
                        p.Package = pack;
                        p.Gross = gross;
                        p.LastUpdated = DateTime.Now;
                        PickingList.Objects.Update(p);
                       
                        IDataParameter[] parameters = new IDataParameter[3];
                        parameters[0] = new SqlParameter("@artno", artid);
                        parameters[1] = new SqlParameter("@marketid", 1);
                        parameters[2] = new SqlParameter("@supid", supid);
                        dgvPickingList.DataSource = GetSproc("GetPickingListByArt", parameters);
                    }
                   
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Lỗi \n" + ex.Message);
            }
        }

        //Kiểm tra số liệu nhập vào
        private void dgvPickingListDetail_RowValidating(object sender, DataGridViewCellCancelEventArgs e)
        {
            if(dgvPickingListDetail.IsCurrentRowDirty && e.ColumnIndex >0)
            {
                var _pick = dgvPickingListDetail.Rows[e.RowIndex];
                float n = 0;
                int k = 0;
                if (!float.TryParse(_pick.Cells[4].Value.ToString().Trim(), out n))//Nếu Gross không phải là số
                {
                    MessageBox.Show("Gross must be a number!");
                    e.Cancel = true;
                }
                else if (!int.TryParse(_pick.Cells[6].Value.ToString().Trim(), out k))//Nếu số lượng khay lớn không phải là số
                {
                    MessageBox.Show("Lager must be a numberr!");
                    e.Cancel = true;
                }
                else if (!int.TryParse(_pick.Cells[7].Value.ToString().Trim(), out k))//Nếu số lượng khay lỡ không phải là số
                {
                    MessageBox.Show("Medium must be a number!");
                    e.Cancel = true;
                }
                else if (!int.TryParse(_pick.Cells[8].Value.ToString().Trim(), out k))//Nếu số lượng khay nhỏ không phải là số
                {
                    MessageBox.Show("Small must be a number!");
                    e.Cancel = true;
                }
                else if (!int.TryParse(_pick.Cells[9].Value.ToString().Trim(), out k))//Nếu số lượng khay bé không phải là số
                {
                    MessageBox.Show("Tiny must be a number!");
                    e.Cancel = true;
                }
                else
                {
                    _pick.Cells[2].Value = pickingid;
                    _pick.Cells[3].Value = supid;
                    _pick.Cells[13].Value = WorkSession.Current.CurrentUser.ID;
                    _pick.Cells[12].Value = DateTime.Now.ToString();
                    float nloss = 0, ploss = 0,pcknet=0;
                    int l = int.Parse(_pick.Cells[6].Value.ToString());
                    int m = int.Parse(_pick.Cells[7].Value.ToString());
                    int s = int.Parse(_pick.Cells[8].Value.ToString());
                    int t= int.Parse(_pick.Cells[9].Value.ToString());
                    var l1 = Package.Objects.Where(x => x.PckName == "Large").ToList();
                    var m1 = Package.Objects.Where(x => x.PckName == "Medium").ToList();
                    var s1 = Package.Objects.Where(x => x.PckName == "Small").ToList();
                    var t1 = Package.Objects.Where(x => x.PckName == "Tiny").ToList();
                    if(l >0)
                    {
                        nloss += l*l1[0].NLoss;
                        ploss += l*l1[0].PLoss;
                        pcknet += l*l1[0].Net;
                    }
                    if (m > 0)
                    {
                        nloss += m * m1[0].NLoss;
                        ploss += m * m1[0].PLoss;
                        pcknet += m * m1[0].Net;
                    }
                    if (s > 0)
                    {
                        nloss +=s * s1[0].NLoss;
                        ploss += s* s1[0].PLoss;
                        pcknet += s * s1[0].Net;
                    }
                    if (t > 0)
                    {
                        nloss += t * t1[0].NLoss;
                        ploss += t * t1[0].PLoss;
                        pcknet += t * t1[0].Net;
                    }
                    _pick.Cells[10].Value = nloss;//Gán NLoss tổng
                    _pick.Cells[11].Value = ploss;//Gán Ploss tổng
                    _pick.Cells[5].Value = float.Parse(_pick.Cells[4].Value.ToString()) - pcknet - nloss - ploss;//Gán giá trị net
                }

            }
            _curr = dgvPickingListDetail.IsCurrentRowDirty;
        }


        private void dgvPickingListDetail_DataError(object sender, DataGridViewDataErrorEventArgs e)
        {

        }


        //In chi tiết lần cân
        private void printDocument1_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
        {
            try
            {
                Font font = new Font("Times New Roman", 13, FontStyle.Bold);
                Font font1 = new Font("Times New Roman", 10, FontStyle.Regular);
               
                //Vẽ hình các ô
                 e.Graphics.DrawRectangle(new Pen(Color.Black), 100, 100, 250, 100);//Mã
                 e.Graphics.DrawRectangle(new Pen(Color.Black), 350, 100, 150, 50);//Date
                 e.Graphics.DrawRectangle(new Pen(Color.Black), 350, 150, 150, 50);//Ngày

                 e.Graphics.DrawRectangle(new Pen(Color.Black), 100, 200, 400, 50);//Nhà cung ứng
                 e.Graphics.DrawRectangle(new Pen(Color.Black), 100, 250, 400, 50);//Mã kho
                 e.Graphics.DrawRectangle(new Pen(Color.Black), 100, 300, 400, 50);//Mã p


                 e.Graphics.DrawRectangle(new Pen(Color.Black), 100, 350, 100, 50);//Net
                 e.Graphics.DrawRectangle(new Pen(Color.Black), 200, 350, 100, 50);//Gross
                 e.Graphics.DrawRectangle(new Pen(Color.Black), 300, 350, 100, 50);//Nloss
                 e.Graphics.DrawRectangle(new Pen(Color.Black), 400, 350, 100, 50);//Ploss

                 e.Graphics.DrawRectangle(new Pen(Color.Black), 100, 400, 100, 50);//rNet
                 e.Graphics.DrawRectangle(new Pen(Color.Black), 200, 400, 100, 50);//rGross
                 e.Graphics.DrawRectangle(new Pen(Color.Black), 300, 400, 100, 50);//rNloss
                 e.Graphics.DrawRectangle(new Pen(Color.Black), 400, 400, 100, 50);//rPloss

                 e.Graphics.DrawRectangle(new Pen(Color.Black), 100, 450, 200, 50);//Note
                 e.Graphics.DrawRectangle(new Pen(Color.Black), 300, 450, 200, 50);//Package


                //Lấy dữ liệu để in
                string supname =
                    Supplier.Objects.FirstOrDefault(
                        x => x.ID == int.Parse(dgvPickingListDetail.CurrentRow.Cells[3].Value.ToString())).Name;
                int art = PickingList.Objects.FirstOrDefault(x => x.ID == pickingid).ArtId;
                string artname = Article.Objects.FirstOrDefault(x => x.ID == art).ArtName;
                int storeid = PickingList.Objects.FirstOrDefault(x => x.ID == pickingid).StoreId;
                string storename = Store.Objects.FirstOrDefault(x => x.Id == storeid).StoreName;
                string gross = dgvPickingListDetail.CurrentRow.Cells[4].Value.ToString();
                string net = dgvPickingListDetail.CurrentRow.Cells[5].Value.ToString();
                string nloss = dgvPickingListDetail.CurrentRow.Cells[10].Value.ToString();
                string ploss = dgvPickingListDetail.CurrentRow.Cells[11].Value.ToString();
                int pck = int.Parse(dgvPickingListDetail.CurrentRow.Cells[6].Value.ToString()) +
                          int.Parse(dgvPickingListDetail.CurrentRow.Cells[7].Value.ToString()) +
                          int.Parse(dgvPickingListDetail.CurrentRow.Cells[8].Value.ToString()) +
                          int.Parse(dgvPickingListDetail.CurrentRow.Cells[9].Value.ToString());
                string note = dgvPickingListDetail.CurrentRow.Cells[14].Value.ToString();

                //In chữ tương ứng
                e.Graphics.DrawString(supname, font1, Brushes.Black, 110, 140);//In tên nhà cung cấp
                 e.Graphics.DrawString("Date", font, Brushes.Black, 370, 120);//In dòng "Date"
                 e.Graphics.DrawString(DateTime.Now.ToShortDateString(), font1, Brushes.Black, 370, 170);//In  ngày tháng
                 e.Graphics.DrawString(storename, font1, Brushes.Black, 110, 220);//In  tên kho
                 e.Graphics.DrawString(storeid.ToString(), font1, Brushes.Black, 110, 270);//In  mã kho
                 e.Graphics.DrawString(artname, font1, Brushes.Black, 130, 320);//In tên hàng hóa
                 e.Graphics.DrawString("NET", font, Brushes.Black, 110, 370);//In  dòng chữ "Net"
                 e.Graphics.DrawString("GROSS", font, Brushes.Black, 210, 370);//In  dòng chữ "Gross"
                 e.Graphics.DrawString("NLOSS", font, Brushes.Black, 310, 370);//In  dòng chữ "Nloss"
                 e.Graphics.DrawString("PLOSS", font, Brushes.Black, 410, 370);//In  dòng chữ "Ploss"

                 e.Graphics.DrawString(net, font1, Brushes.Black, 110, 420);//In  giá trị net
                 e.Graphics.DrawString(gross, font1, Brushes.Black, 210, 420);//In  giá trị gross
                 e.Graphics.DrawString(nloss, font1, Brushes.Black, 310, 420);//In  giá trị nloss
                 e.Graphics.DrawString(ploss, font1, Brushes.Black, 410, 420);//In  giá trị ploss

                 e.Graphics.DrawString(note, font1, Brushes.Black, 110, 470);//In  giá trị nloss
                 e.Graphics.DrawString(pck.ToString() + " Package(s)", font1, Brushes.Black, 310, 470);//In  giá trị ploss
            }
            catch (Exception ex)
            {
                MessageBox.Show("Lỗi: \n" + ex.Message);
            }
        }

        //Nếu chọn nút print thì tiến hành in chi tiết lần cân đó
        private void dgvPickingListDetail_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            try
            {
                if (e.ColumnIndex == 15) //Nếu nhấn vào nút in thì tiến hành in lần cần đó
                {
                    var pick = dgvPickingListDetail.Rows[e.RowIndex];
                    if (pick.Cells[0].Value != null && pick.Cells[0].Value.ToString() != "0")
                    {
                        printDocument1.Print();
                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Lỗi :\n" + ex.Message);
            }
            
        }

    }
}
